home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack2-4.sfx
/
hack.4
Wrap
Text File
|
1990-02-12
|
17KB
|
515 lines
.%0860! FETCHLINE = *
.%0861! STA ZW1
.%0862! STY ZW1+1
.%0863! LDX #2
.%0864! - LDA SORT╨,X
.%0865! STA ZP1,X
.%0866! DEX
.%0867! BPL -
.%0868! LDX #HEADER
.%0869! LDY #4
.%0870! JSR ZPLOAD
.%0871! LDA HEADER+3
.%0872! LDY #0
.%0873! JMP FETCH
.%0874!
.%0875! ;*** SORT╟╘CMP( SORTLINE, CMPLINE ) : .├╙=█SORTLINE >= CMPLINE▌
.%0876!
╘HIS ROUTINE COMPARES THE LINES STORED IN THE "SORTLINE" AND "CMPLINE" BUFFERS
AND RETURNS WITH CARRY SET IF THE "SORTLINE" IS LARGER (ALPHABETICALLY). ╔T
ALSO TAKES INTO ACCOUNT THE STARTING COMPARISON POSITIONS AND HANDLES THE CASE
OF EITHER OR BOTH LINES NOT BEING AS LONG AS THE START POSITION OF THE STRING
COMPARISON.
.%0877! SORT╟╘CMP = *
╘HIS SECTION OF CODE MAKES BIT0 OF .╪ A "1" IF SORTLINE IS NOT LONG ENOUGH TO
BE COMPARED, AND MAKES BIT1 A "1" IF CMPLINE IS TOO SHORT.
.%0878! LDX #0
.%0879! CLC
.%0880! LDA SORT├OLUMN
.%0881! ADC #5
.%0882! CMP SORTBUFLEN
.%0883! BCC +
.%0884! INX
.%0885! + CMP CMPBUFLEN
.%0886! BCC +
.%0887! INX
.%0888! INX
┴ND HERE IS WHERE IT TAKES ACTION DEPENDING WHETHER THE LINES ARE LARGE ENOUGH
OR NOT. ╘HE CASES ARE:
. .╪=%00000000 - STRINGS ARE LONG ENOUGH TO BE COMPARED, SO CONTINUE
. .╪=%00000001 - SORTLINE IS TOO SHORT, CMPLINE OK, SO RETURN WITH CARRY CLEAR
. .╪=%00000010 - CMPLINE IS TOO SHORT, SORTLINE OK, SO RETURN WITH CARRY SET
. .╪=%00000011 - BOTH SORTLINE AND CMPLINE ARE TOO SHORT; CARRY SET
.%0889! + TXA
.%0890! BEQ DO├OMPARE
.%0891! CMP #2
.%0892! RTS
.%0893!
.%0894! DO├OMPARE = *
╘HIS SECTION DOES THE COMPARE IF BOTH LINES ARE LONG ENOUGH.
.%0895! LDY SORT├OLUMN
.%0896! - LDA SORTLINE,Y
.%0897! CMP CMPLINE,Y
.%0898! BNE +
.%0899! CMP #0
.%0900! BEQ +
.%0901! INY
.%0902! BNE -
.%0903! + RTS
.%0904!
.%0905! ;*** POSITION╠INE( SORTLINE ) : SORT╤=PREV, SORT╨=NEXT
.%0906!
╘HIS ROUTINE SEARCHES FOR THE CORRECT POSITION IN THE LINE LIST TO INSERT THE
NEW LINE, AND RETURNS SORT╤ AND SORT╨ TO STRADDLE THE NEW LINE POSITION. ╬OTE
THAT THIS ROUTINE CAUSES THE LIST TO BE IN REVERSE ORDER AS DISCUSSED
EARLIER.
.%0907! POSITION╠INE = *
╙ET ╨ TO HEAD AND ╤ TO ╬ULL.
.%0908! LDX #2
.%0909! - LDA #BK╬ULL
.%0910! STA SORT╤,X
.%0911! LDA SORTHEAD,X
.%0912! STA SORT╨,X
.%0913! DEX
.%0914! BPL -
.%0915!
.%0916! POSITION╙EARCH = *
╘HIS ROUTINE BREAKS OUT IF THE CURRENT LINE POINTER IS ╬ULL. ╧THERWISE, IT
FETCHES THE CURRENT LINE POINTER (SORT╨) INTO THE CMPLINE BUFFER AND CALLS THE
STRING COMPARE ROUTINE. ╔F THE NEW LINE READ IN FROM THE FILE IS GREATER THAN
OR EQUAL TO THE CURRENT LINE ALREADY IN THE LIST, THE SEARCH KICKS OUT. ╘HE
"BCS" ON LINE 924 CONTROLS THE ORDER OF THE SORT. ╧THERWISE, THE ╨ AND ╤
POINTERS ARE UPDATED IN THE USUAL WAY AND THE SEARCH CONTINUES.
.%0917! LDA SORT╨+2
.%0918! CMP #BK╬ULL
.%0919! BEQ POSITION┼XIT
.%0920! LDA #<CMPBUF
.%0921! LDY #>CMPBUF
.%0922! JSR FETCHLINE
.%0923! JSR SORT╟╘CMP
.%0924! BCS POSITION┼XIT ;** CONTROLS SORT ORDER
.%0925! LDX #2
.%0926! - LDA SORT╨,X
.%0927! STA SORT╤,X
.%0928! LDA CMPBUF,X
.%0929! STA SORT╨,X
.%0930! DEX
.%0931! BPL -
.%0932! BMI POSITION╙EARCH
.%0933!
.%0934! POSITION┼XIT = *
┴T THIS POINT, SORT╨ AND SORT╤ STRADDLE THE POSITION TO PUT THE NEW LINE, SO
WE RETURN.
.%0935! RTS
.%0936!
.%0937! ;*** STORELINE( SORTLINE ) █BETWEEN SORT╤ AND SORT╨▌
.%0938!
╘HIS ROUTINE ACTUALLY STORES THE NEW LINE READ IN BETWEEN THE SORT╤ AND SORT╨
LINES.
.%0939! STORELINE = *
╞IRST, SPACE FOR THE NEW LINE IS ALLOCATED.
.%0940! LDA SORTBUFLEN
.%0941! LDY #0
.%0942! JSR MALLOC
.%0943! BCC +
.%0944! RTS
┴ND THE NEW LINE'S NEXT POINTER IS SET TO POINT TO SORT╨.
.%0945! + LDX #2
.%0946! - LDA SORT╨,X
.%0947! STA SORTBUF,X
.%0948! DEX
.%0949! BPL -
┴ND THE NEW LINE IS STASHED OUT TO MAIN MEMORY.
.%0950! LDA #<SORTBUF
.%0951! LDY #>SORTBUF
.%0952! STA ZW1
.%0953! STY ZW1+1
.%0954! LDA SORTBUFLEN
.%0955! LDY #0
.%0956! JSR STASH
╬OW ALL THAT IS LEFT TO IS MAKE THE PREVIOUS LINE RECORD (SORT╤) POINT TO THE
NEW LINE RECORD.
.%0957! LDA SORT╤+2
.%0958! CMP #BK╬ULL
.%0959! BEQ STORELINE╞IRST
╔F THERE IS AN ACTUAL PREVIOUS LINE, THE NEW LINE POINTER IS WRITTEN OUT OVER
THE NEXT LINE POINTER IN ITS HEADER.
.%0960! LDX #2
.%0961! - LDA ZP1,X
.%0962! LDY SORT╤,X
.%0963! STA SORT╤,X
.%0964! STY ZP1,X
.%0965! DEX
.%0966! BPL -
.%0967! LDX #SORT╤
.%0968! LDY #3
.%0969! JSR ZPSTORE
.%0970! CLC
.%0971! RTS
.%0972!
╔F THERE IS NO ACTUAL PREVIOUS LINE, THEN THE LINE LIST HEAD POINTER IS SET TO
POINT TO THE NEW LINE (WHICH IS NOW THE FIRST LINE ON THE LIST).
.%0973! STORELINE╞IRST = *
.%0974! LDX #2
.%0975! - LDA ZP1,X
.%0976! STA SORTHEAD,X
.%0977! DEX
.%0978! BPL -
.%0979! CLC
.%0980! RTS
.%0981!
.%0982! ;*** READFILE()
.%0983!
╘HIS ROUTINE READS IN THE FILE AND PUTS THE LINES INTO THEIR CORRECT SORTED
POSITIONS AS IT IS READING.
.%0984! READFILE = *
├LEAR THE LINE LIST BY SETTING THE HEAD POINTER TO ╬ULL.
.%0985! LDX #2
.%0986! LDA #BK╬ULL
.%0987! - STA SORTHEAD,X
.%0988! DEX
.%0989! BPL -
╙ET THE ┼╧╞ FLAG TO 0 AND SET THE CURRENT INPUT CHANNEL TO LOGICAL FILE #1
WHICH IS ASSUMED TO BE OPENED BEFORE THE SORT UTILITY IS INVOKED.
.%0990! LDA #0
.%0991! STA EOFSTAT
.%0992! LDX #1
.%0993! JSR KERNEL├HKIN
.%0994! BCS READ┼XIT
╒NTIL ┼╧╞, READ THE NEW LINE, FIND THE POSITION IN THE LINE LIST, STORE IT,
PRINT OUT A "." TO INDICATE TO THE USER THAT ANOTHER LINE HAS BEEN PROCESSED,
AND REPEAT. ┼XIT ON ┼╧╞.
.%0995! - JSR GETLINE
.%0996! BCS READ┼XIT
.%0997! JSR POSITION╠INE
.%0998! JSR STORELINE
.%0999! BCS READ┼XIT
.%1000! LDA #"."
.%1001! JSR ECHO╙TATUS
.%1002! JMP -
.%1003!
.%1004! READ┼XIT = *
.%1005! RTS
.%1006!
.%1007! ;*** WRITEFILE()
.%1008!
╘HIS ROUTINE WRITES THE LINE LIST OUT TO LOGICAL FILE NUMBER 2 WHICH IS
ASSUMED TO BE OPENED BEFORE THE SORT UTILITY IS INVOKED. ╘HIS ROUTINE FOLLOWS
THE STANDARD STRUCTURE FOR PROCESSING A LINKED LIST.
.%1009! WRITEFILE = *
.%1010! LDX #2
.%1011! - LDA SORTHEAD,X
.%1012! STA SORT╨,X
.%1013! DEX
.%1014! BPL -
.%1015! LDX #2
.%1016! JSR KERNEL├HKOUT
.%1017!
.%1018! WRITE╠INE = *
.%1019! LDA SORT╨+2
.%1020! CMP #BK╬ULL
.%1021! BEQ WRITE┼XIT
.%1022! LDA #<SORTBUF
.%1023! LDY #>SORTBUF
.%1024! JSR FETCHLINE
.%1025! JSR PUTLINE
.%1026! LDX #2
.%1027! - LDA SORTBUF,X
.%1028! STA SORT╨,X
.%1029! DEX
.%1030! BPL -
.%1031! JMP WRITE╠INE
.%1032!
.%1033! WRITE┼XIT = *
.%1034! JSR KERNEL├LRCHN
.%1035! RTS
.%1036!
.%1037! ;*** REVERSE╠IST()
.%1038!
╘HIS ROUTINE WILL REVERSE THE ORDER OF THE LINE LIST. ╙TARTING FROM THE HEAD
LINE, EACH LINE IS EXTRACTED AND IS MADE TO POINT TO THE PREVIOUS LINE
EXTRACTED. ╬O DATA ACTUALLY HAS TO BE MOVED AROUND; ONLY THE HEADERS OF THE
LINE RECORDS HAVE TO BE CHANGED.
.%1039! REVERSE╞ILE = *
.%1040! LDX #2
.%1041! - LDA SORTHEAD,X
.%1042! STA ZP1,X
.%1043! LDA #BK╬ULL
.%1044! STA SORTHEAD,X
.%1045! DEX
.%1046! BPL -
.%1047!
.%1048! REVERSE╠INE = *
.%1049! LDA ZP1+2
.%1050! CMP #BK╬ULL
.%1051! BEQ REVERSE┼XIT
╞ETCH THE POINTER FROM THE CURRENT LINE INTO SORT╨ AND THEN REPLACE IT WITH
THE VALUE AT SORTHEAD (THE PREVIOUS LINE ALTERED).
.%1052! LDX #SORT╨
.%1053! LDY #3
.%1054! JSR ZPLOAD
.%1055! LDX #SORTHEAD
.%1056! LDY #3
.%1057! JSR ZPSTORE
═AKE SORTHEAD POINT TO THE CURRENT LINE, AND THEN GO TO THE NEXT LINE WHOSE
POINTER WAS EXTRACTED FROM THE CURRENT LINE (BEFORE THE CURRENT LINE WAS
CHANGED).
.%1058! LDX #2
.%1059! - LDA ZP1,X
.%1060! STA SORTHEAD,X
.%1061! LDA SORT╨,X
.%1062! STA ZP1,X
.%1063! DEX
.%1064! BPL -
.%1065! BMI REVERSE╠INE
.%1066!
.%1067! REVERSE┼XIT = *
.%1068! RTS
.%1069!
.%1070! ;*** FREEFILE()
.%1071!
╘HIS ROUTINE SCANS THROUGH THE LINES IN THE LINE LIST AND DEALLOCATES EACH
LINE RECORD.
.%1072! FREEFILE = *
.%1073! LDX #2
.%1074! - LDA SORTHEAD,X
.%1075! STA ZP1,X
.%1076! DEX
.%1077! BPL -
.%1078!
.%1079! FREE╠INE = *
.%1080! LDA ZP1+2
.%1081! CMP #BK╬ULL
.%1082! BNE +
.%1083! RTS
.%1084! + LDX #HEADER
.%1085! LDY #4
.%1086! JSR ZPLOAD
.%1087! LDA HEADER+3
.%1088! LDY #0
.%1089! JSR FREE
.%1090! LDX #2
.%1091! - LDA HEADER,X
.%1092! STA ZP1,X
.%1093! DEX
.%1094! BPL -
.%1095! JMP FREE╠INE
.%1096!
.%1097! ;*** MAIN()
.%1098!
╞INALLY! ╘HE MAIN ROUTINE SETS THE SORT KEY COLUMN AND CALLS EACH OF THE
SUBROUTINES FOR THE DIFFERENT PHASES OF THE SORT AND PRINTS OUT A LETTER
INDICATING WHAT THE PROGRAM IS CURRENTLY DOING.
.%1099! MAIN = *
.%1100! CMP #1
.%1101! BCC +
.%1102! SBC #1
.%1103! + STA SORT├OLUMN
.%1104! LDA #"S"
.%1105! JSR ECHO╙TATUS
.%1106! JSR STARTUP
.%1107! LDA #"R"
.%1108! JSR ECHO╙TATUS
.%1109! JSR READFILE
.%1110! LDA #"V"
.%1111! JSR ECHO╙TATUS
.%1112! JSR REVERSE╞ILE
.%1113! LDA #"W"
.%1114! JSR ECHO╙TATUS
.%1115! JSR WRITEFILE
.%1116! LDA #"F"
.%1117! JSR ECHO╙TATUS
.%1118! JSR FREEFILE
.%1119! LDA #"X"
.%1120! JSR ECHO╙TATUS
.%1121! JSR SHUTDOWN
.%1122! LDA #13
.%1123! JSR ECHO╙TATUS
╔T RETURNS WITH .┴ SET TO ZERO IN CASE THE USER CALLS SORT AGAIN AND FORGETS
TO SPECIFY A VALUE FOR THE SORTING COLUMN USING THE ┬┴╙╔├ ╙┘╙ STATEMENT.
.%1124! LDA #0
.%1125! RTS
------------------------------------------------------------------------------
5. ╞╒╘╒╥┼ ┼╬╚┴╬├┼═┼╬╘╙
╘HIS DYNAMIC MEMORY ALLOCATION PACKAGE DOES NOT SUPPORT EXPANDED INTERNAL
MEMORY (AS SPECIFIED IN ╘WIN ├ITIES-128 ═AGAZINE) OR ╥AM╠INK MEMORY. ╔ AM
PLANNING TO MODIFY THE MEMORY ALLOCATION IN THE ┌ED-128 PROGRAM TO SUPPORT
BOTH OF THESE KINDS OF MEMORY. ╘HE EXTRA INTERNAL MEMORY BANKS WOULD BE
ACCESSED IN A SIMILAR MANNER AS ╥┴═1 IS, EXCEPT THAT ╔ WILL NEED TO HAVE SOME
SPECIAL BANK NUMBERS FOR THEM, SINCE THEY CANNOT BE HANDLED IN EXACTLY THE
SAME WAY AS ╥┴═0 AND ╥┴═1. ╔ WILL ALSO HAVE TO MODIFY THAT OTHER ══╒ REGISTER
IN ORDER TO SELECT WHICH REAL BANKS SHOW UP IN THE ╥┴═2 AND ╥┴═3 POSITONS.
╘HE MEMORY INSIDE A ╥AM╠INK CAN BE ACCESSED IN A SIMILAR WAY TO HOW MEMORY IS
ACCESSED IN AN ╥┼╒. ╧NE BIG DIFFERENCE IS THAT THE LAYOUT OF THE STORAGE IN A
╥AM╠INK IS ACTUALLY ORGANIZED. ┴ ╥AM╠INK (AND A ╥AM─RIVE ╔ ASSUME) CAN HAVE
UP TO 31 PARTITONS OF VARIOUS TYPES. ╔ AM THINKING THAT TO SNIFF A ╥AM╠INK,
THE PACKAGE WILL CHECK TO SEE IF YOU HAVE A ╥AM╠INK AND WILL THEN CHECK TO SEE
IF YOU HAVE PARTITON NUMBER 31 SET UP AS A "FOREIGN" MODE PARTITION WITH THE
NAME "SWAP". ╔F SO, THE PACKAGE WILL ASK THE ╥╠-─╧╙ FOR THE START ADDRESS AND
LENGTH OF THE PARTITION AND WILL THEN USE THE ╥AM╠INK MEMORY INSTEAD OF AN
╥┼╒. ╘HIS MAKES SENSE SINCE AN ╥┼╒ CAN BE MADE INTO BE PART OF THE ╥AM╠INK
AND SINCE YOU CAN GET A LOT MORE MEMORY IN A ╥AM╠INK THAN ╔ HAVE EVER HEARD OF
IN AN EXPANDED ╥┼╒. ╔ PERSONALLY HAVE AN 8 ═EG ╥AM╠INK AND ╔ HAVE SET ASIDE A
1 ═EG PARTITION FOR THE SWAP SPACE. ╬OW ╔ JUST HAVE TO WRITE THE SOFTWARE TO
USE IT.
╘HESE ADDITIONAL TYPES OF MEMORY CAN BE SEEMLESSLY IMPLEMENTED INTO THIS
PACKAGE AND THE USAGE WILL BE COMPELETELY TRANSPARENT TO THE USER AND TO THE
HIGHER LEVEL ROUTINES.
┴LSO, ALTHOUGH ╔ HAVE NOT ATTEMPTED TO DO THIS, THE CODE PRESENTED HERE COULD
BE PORTED TO THE ├OMMODORE 64. ╘HE COMMON CODE ROUTINES WOULD BE REMOVED
SINCE THE 64 HAS ONLY ONE INTERNAL BANK, AND INSTEAD OF USING THE ══╒ TO
SELECT ╥┴═0, YOU WOULD STORE INTO THE PROCESSOR ╔/╧ PORT TO SELECT THE BARE
INTERNAL ╥┴═. (┘OU WOULD ALSO HAVE TO WORRY ABOUT INTERRUPTS HAPPENING WHILE
YOU ARE ACCESSING THIS MEMORY). ┴LL OF THE HIGHER LEVEL CODE ABOVE THE
ZPLOAD, ZPSTORE, FETCH AND STASH ROUTINES WOULD (PROBABLY) STAY (PRETTY MUCH)
THE SAME, SINCE THEY CALL THE LOWER LEVEL ROUTINES TO DO THE ACTUAL
MACHINE-SPECIFIC GRUNT WORK.
╔F YOU HAVE ANY QUESTIONS OR COMMENTS ABOUT THIS ARTICLE, FEEL FREE TO DROP ME
A LINE.
------------------------------------------------------------------------------
6. ╒╒┼╬├╧─┼─ ┬╔╬┴╥╔┼╙
╚ERE ARE THE ┬┴╙╔├ PROGRAM AND THE MACHINE LANGUAGE SUBROUTINES FOR THE
SORTING UTILITY. ╘HEY ARE IN UUENCODED FORM AND YOU WILL PROBABLY HAVE TO
EXTRACT THEM INTO A SEPARATE FILES BEFORE YOU UUDECODE THEM. ┼NJOY!
BEGIN 640 SORT ═└1╨╞'└$└222╥(─┼.4%541─┼,12┘46%0┬(#╚@242╥."└┌(%-&╠├$└11╨"└$\─
═╠┬)/5510551&24╤%+┼185"(@.┬!/1+(╪└$╠<└╨└┌└&8<9└"9(─╤/041)3─<@
═4╘]25"┘"24╪╬+┬╪┬└'└<;@#^└┬└╤-0"'''@└_┴$┬4╘]25"┘"24╪┬+%4╚240╔
═└*4<@@"9(┼-#4─%40╘┴)3─<@3╘╤$($9)3$4╬+┬╪┬└+4<├└#╥*$\─*2╤5*$]$
═*0#'')8└╞2)33╒)424┘'+┬╪╬(@#;'*└└╟╙$╠240╠,┬╨┬,#╚┬╩───└/8<╩@"?
═,┬╤/1"╨╙+"(╨.┬*╩3╥2╩(┬╤3+%<┬└└─=═└">(-$╚(├$╙,#└┬*2╤31@└0';╪└
=╚#(└%╤╫(└*└╤└"@=╘@"9(─9)3─┼32$5$(2(└└└└╚ └ END
BEGIN 640 SORT.BIN
═└!-,╔!┼,(╤-,-┴-,╥!-,_┴-,#11,;11,└╤9,╥18└└└└└└└└└└*─└2"┬╔#╚╘└
═_╥!($╥#\%""╟%6"┬└*─└╟0└"┌.!╥╘/┬╔└(╘└_╓"┬└+╒6$┘╘└└╬├@<╔#╒8*7\
═├0#_┴/╓@└+'┌┼0#╚╥,3]─/:╔#╚╘└_╓"┼_(╘└_╪3]╚└"╒└)'┌┌,├$_9#╓╩0┌-
═└/]@┬/└-├0+_╠?╩-└?^1_╚├0\╪╘"_['┌├0'_─?┌╔#╚╘└_╓"(\└╓-└?^╤_╚╘"
═_┘'┌┬-#╙├0'_╠?┌-└╧^1^╩─.├0#_8*7\,└-,└└*,!]^@─8╘&╫╪╪"╫┌╘'╒8╘#
═╫┌7┌├03?╔?╬-!=^╔└(╘(╫┌╘╨╘*(└├├#0├└'?├3#08*7\,└-,&0*,!]^@─$╙4
═$┌;\$└6┬─4╙-%,└└╘"*╚╘└%@╪#_╨└╘╨╥└╚╪└_╪├╨!['┌─?┌(╘/╞╤^╔'^╩0┌-
═└/]@┴8"$@:7[┴8*┼_╪6#╔8'╨#┌;\╚└└@'┴3╞^^;_╤╚'0\:2└\└6╞_"└>%*6"
═┴?╬┼@╪7_8*;\$└6┬─$╙-%,└└╘"*╚╘└%@╪#_╨└╘╤2└╚╪└_╪├╨!['^─?╩(╘/╞╤
═_╔'┌╩0┌-└/]@┴8"$@:7_┴8*┼^╪6#╔8'╨#┌;\╚└└@?┴3╞^^;_╤╚'0\:2└\└6╞
═_"!^%*6"┴?^┼@╪7[8(╘'╫╪╨(╫┌7^╔/^-└═^,└]^┼^╩3[├03?├└7?╔?╥-!═^╠
═,-"╔└(╘╨╘(╪!╫╪╨╨╘&!_╩3^-└/^┬"╦╘└╫┘╘└"\╚0]┌─.├0#_╩0"-"=^-"═^═
═└-^┬└╦╓┴%96└╥┴#╪╩0"-'!.╔└**└┴?╩%^╪;\(%╨5╠└?╬'!/╞_-#╘╦1╨3╘!6╔
═/╪╘└_┌(*╧0└+╟0#?╥┴#╫╩0┌-└/]@╦1╨3╙?╠4─└%@╔?╥%@┌*└╚└0@#!,@┴16╨
═#┌7\2*╞└┴?╥%@╥"%%6┬%_&"╔└(6$┴8>┬┴*└$(└─3╚@.╒┴-6└╘└7*$/<88#┴@
═4╠┼$0└3[╚@*╔└)╘@$┌╟_╟1╘3╥┴#╙.*╘2$╧└!&*╘3$╬╓─%:┬═╔!6┬/╥#╪%:╓┼
═%:╥╞%:)_(/@5╩0"%├┌6/╙1╨3╠!4)@(7\╩0"%^╚7[╩?┬@_╥└8$^:/╘.1@┴?╬&
═_*─└┴?╔,&!,8:0>0└<@╔^(6%┴(:┬└╦╘=$┘7┌╩?^5┴\╚0]*7\╥?_0#┌╟_┴?╩%
═^╪7\╩0&-&╤,╪8**└╚└4@"1.┼@\6%╔83┼┴╦└0╚@*╒^╔6'═8"5^╠╚0]4╨=%├┬═
═(!/┼┴8╘@$┌╘┴$^6&├2$3╠└/.(┴.┼@\6%╘└:┼┴.6&\",╪╔8/┼┴86#╔83┼┴╚6$
═╚╚"@!2└,$╤┬┼^╞6#┴?╩┼^╓6$┴?╠88*6)╥?_0#*("═8"='1/*$/@88*("═?╩╘
═┴┘6'┼/╦*$/6┬@*└#(└╨3╚@*╒┴┘7┌╥┴#┘&&└8:0>0└<@╔^(6%┴(:┬└╦7┌┼8>]
═'1.5^╩╟_┼8╦*$/"┼_,╟_\"┬┼_,6)─"+0"╩7┌╤8>┼^^6(╠!:┬@*└#(└─3╚@*╒
═^╔6*═8"5^╠╚0]3#2╚@*╒┬╔7┌╥┴#┘╔?╙)_]└:╚@*]'1.5@+6'╟1╘3╥┴#╙╔86─
═┴╚6#┴(1,┴!>┬@*└%(└─3╔?╙%┬=└╩&*7┌98.╩╔?═┼┴,6(╘!╙─┴]└8&*6#986%
═@┌6$98:%┴*("═8╩5┴\╚0^3└/╚╚>@└╥└,$┌6%╔(:%@╪2$╔8╟%@═└╙&*6'98.╩
═╔8┴┼┴,6!╘"7─@-└┴╚@*╒@)7┌╥┴#┘╔81(╔8-(╚╚"@!2└)$╤┴╚98.%@╓┴┼┴(6$
═╚@*╒┴┘7┌╥┴#┘╚╚"@!2└,$╤┬═(!-┼┴8╘@$┌╘┴$╓6&├2$3─└/╬(┴,88*└└)└)╨
═)"#/_[└?╞00+╥*:0┴@+└\+└%╥0╫0┘╪┬╔└)─$"╤┬8:06-└╨╠88*┼└┴0+└└-#╩
═.&"@└+─$"_└&(-+_╥-#╒╩0╒,╘╧^%_╚3_╚@*╒!╔7┌╥┴#┘╚@╥@!"└)$┌4/╚└!,
═#╤.┬└!┬═_╨┴╔!<╘#"┘└!┌,╘#")└"┌.┬*\└/)└╞"╠_╨┬┘!└╧9!└├0!\─└\└/(
═╘/%@╚@*╔_┘4)═0.5!╠╚0]:4(╥?_╨'*─└╚└@@*╤@@1┴┬╨$*("═0:5";╘└")4&
═╥┴#╘,-┘@╦0,+╚└└@%1.0└6"┬└╦4&╟0└+╥┴#╪╩0"@"╪7^┴/^═└╨╬@└"└2$┌4+
═╥?_╨%╩("═?╩╘"94)┼/╦*$/6┬":└#(└╨3&&"┬└╦7┌┼0/*$/─88*("╩?^5└\╚0
═^┌─└┴0*┬└2#&_[└5(.47╠!└@=!@@╔!┬╨"*─╬(-+_3└098*("═0.5!╠╚0^:("
═(,╟_╔0├)__└7╩0"@"╥└╦&"└9&*("╧0└+┼0;*$/┴,*!─@╙/]@╚@*╒└┘7┌╩?^5
═└\╚0]:7\╥?_╨':(&╚└,@"1.┬└┌└#(└╨3╚@*╒^╔4#═0:5^╠╚0]3#=8*("═0.5
═^╠╚0^:7\╥?_0└6"┬#*└$(└─3╔0^@└"└8$┌("═0╥5^╠╚0^4╥#&<─!─└+╔└8╫_
═"*┼3(-+_(└,3╩5(@╘╧\@\!┬╔5┬#2_╥!)&:┼7(-+_(!╚9╩48@╘╧\@>┴╞╔6"#2
,_╥└&$┌─-(-+_╩0!@ └ END
============================================================================
╬EXT ╔SSUE: (╚OPEFULLY!!! :-] )
╘HE 1351 ═OUSE ─EMYSTIFIED
┴N INDEPTH LOOK AT HOW THE 1351 MOUSE OPERATES AND HOW TO ACCESS IT WITHIN
YOUR ═╠ PROGRAMS, IN ADDITION TO A ┬┴╙╔├ DRIVER FOR THE 80 COLUMN SCREEN.
═╠ ╘UTOR - ╨ART 3
╔N THIS EDITION WE TAKE A LOOK AT READING AND WRITING COMMANDS TO THE DISK
DRIVE, INCLUDING READING THE DISK DIRECTORY. ╘HIS ARTICLE WILL ALSO PARALLEL
THE DISCUSSION OF THE ├=128 AND ├=64 ╦┼╥╬┴╠ JUMP TABLES OF AVAILABLE ROUTINES.
╦┼╥╬┴╠ 64/128
╘HE ├=128 AND ├=64 JUMP TABLE THAT POINTS TO MANY VALUABLE SYSTEM ROUTINES IS
LISTED AND DISCUSSED WITH EXAMPLE APPLICATIONS AND HOW TO USE THEM.
┬URSTING YOUR 128
╘HIS ARTICLE WILL EXAMINE THE ROUTINES AND MYSTERIES ABOUT HOW TO USE ┬URST
COMMANDS ON THE 1571 AND 1581. ╘HESE ROUTINES WILL BE EXTRACT FROM ┌ED-128.
============================================================================
┼╬─ OF ├= ╚ACKING ╔SSUE 2.
============================================================================